#include "mapaplano.h"

#define RADIO (10.0f)
#define ALTURA (0.1f)
#define ANCHO_DE_REFERENCIA (1024.0f)

namespace ui {
namespace tablero {
namespace mapa {

MapaPlano::MapaPlano(TexturaDeFondo &p_TexturaDeFondo, Ciudades &p_Ciudades) :
	MapaAbstracto(p_TexturaDeFondo, p_Ciudades) {
}

MapaPlano::~MapaPlano() {
}

void MapaPlano::dibujarPlaneta() {

	GLUquadricObj *QuadObj = gluNewQuadric();
	double w = static_cast<double>(this->m_TexturaDeFondo.getAncho());
	double h = static_cast<double>(this->m_TexturaDeFondo.getAltura());

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0.0f, static_cast<double>(w),
		0.0f, static_cast<double>(h), -10.0f, 10.0f);

	glEnable(GL_NORMALIZE);
	glEnable(GL_DEPTH_TEST);

	gluQuadricOrientation(QuadObj, GLU_OUTSIDE); 
	gluQuadricDrawStyle(QuadObj, GLU_FILL); 
	gluQuadricNormals(QuadObj, GLU_SMOOTH); 
	gluQuadricTexture(QuadObj, GL_TRUE); 

	glEnable(GL_TEXTURE_2D);
	glMatrixMode(GL_MODELVIEW);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor3f(255.0f, 255.0f, 255.0f);
	glNormal3f(0,0,1);

	glBegin(GL_QUADS);
		glTexCoord2i(1, 0);
		glVertex3f(w, h, 0.0f);
		glTexCoord2i(1, 1);
		glVertex3f(w, 0.0f, 0.0f);
		glTexCoord2i(0, 1);
		glVertex3f(0.0f, 0.0f, 0.0f);
		glTexCoord2i(0, 0);
		glVertex3f(0.0f, h, 0.0f );
	glEnd();	

	glDisable(GL_TEXTURE_2D); 
}

void MapaPlano::dibujarCiudades() {

	GLUquadric *t_pCiudadQuad = gluNewQuadric();

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0.0f, static_cast<float>(this->m_iAncho),
		static_cast<float>(this->m_iAltura), 0.0f, -10.0f, 10.0f);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glEnable(GL_NORMALIZE);
	glEnable(GL_DEPTH_TEST);
	glNormal3f(0,0,1);

	for (int i = 0; i < this->m_Ciudades.getCantidad(); i++) {

		if (i != this->m_Ciudades.getSeleccionada()) glColor3f(1.0, 0.0, 0.0);
		else glColor3f(0.0, 1.0, 0.0);
		
		glPushMatrix();

		glTranslatef(this->m_Ciudades.getCiudad(i).getU2D() * this->m_iAncho, 
			this->m_Ciudades.getCiudad(i).getV2D() * this->m_iAltura, 0.0f);
	
		gluQuadricDrawStyle(t_pCiudadQuad, GLU_FILL);
		gluCylinder(t_pCiudadQuad, RADIO * (static_cast<float>(this->m_iAncho) / ANCHO_DE_REFERENCIA), 0.0f, ALTURA, 20, 20);

		glPopMatrix();
	}

	gluDeleteQuadric(t_pCiudadQuad);
}

void MapaPlano::actualizarPerspectiva(int p_iAncho, int p_iAltura) {

	this->m_iAncho = p_iAncho;
	this->m_iAltura = p_iAltura;

	this->dibujar();
}

void MapaPlano::actualizarCamara() {
	this->dibujar();
}

void MapaPlano::actualizarSeleccion(int p_x, int p_y) {
	this->dibujar();
}

void MapaPlano::moverCamara(mover_camara_e p_eMoverCamara) {
}

}
}
}
